#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QDialog>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
#include <QElapsedTimer>

namespace Ui {
class TcpServer;
}

class TcpServer : public QDialog
{
    Q_OBJECT

public:
    // 在 C++ 中，`explicit` 用于构造函数，可防止隐式转换。
    explicit TcpServer(QWidget *parent = nullptr);

    ~TcpServer();

    // 初始化服务器的函数
    void initServer();

    // 当文件传输被对方拒绝时调用的函数
    void refused();

protected:
    // 重写关闭事件处理函数，当窗口关闭时调用
    void closeEvent(QCloseEvent *);

private:

    Ui::TcpServer *ui;

    // TCP 端口号，用于监听客户端连接
    qint16 tcpPort;

    // TCP 服务器对象，用于监听客户端连接
    QTcpServer *tcpServer;

    // 存储新连接的客户端套接字，用于向客户端发送数据
    QTcpSocket *clientConnection;

    // 总数据大小
    qint64 TotalBytes;

    // 已经发送的数据大小，用于文件传输时的进度显示
    qint64 bytesWritten;

    // 还需要发送的数据大小
    qint64 bytesToWrite;

    // 数据块大小，可能是每次发送数据的最大字节数
    qint64 payloadSize;

    // 发送的文件名，可能是显示给用户的文件名
    QString theFileName;

    // 文件名，可能是实际存储在文件系统中的文件名
    QString fileName;

    // 文件对象，用于读取要发送的文件
    QFile *localFile;

    // 存储要发送的数据块
    QByteArray outBlock;

    // 定时器，用于测量文件发送时间，可用于计算发送速度等
    QElapsedTimer elapsedTime;

signals:

    // 自定义信号，用于发送文件名
    void sendFileName(QString fileName);

private slots:

    // 当有新的客户端连接时调用的槽函数，可能用于发送文件
    void sendMessage();

    // 当有数据发送时更新客户端进度的槽函数，可用于更新进度条等界面元素
    void updateClientProgress(qint64 numBytes);

    // 当点击打开文件按钮时调用的槽函数，可能用于打开文件选择对话框
    void on_serverOpenBtn_clicked();

    // 当点击发送文件按钮时调用的槽函数，可能用于开始文件发送操作
    void on_serverSendBtn_clicked();

    // 当点击关闭服务器按钮时调用的槽函数，可能用于关闭服务器并进行相关清理操作
    void on_serverColseBtn_clicked();

};
#endif // TCPSERVER_H
